
\section{Métodos}
\subsection{Cliente ARP}
La primer consigna del enunciado pide armar un cliente ARP que permita enviar paquetes ARP \textit{who-has} y poder recibir una respuesta. Esto lo conseguimos con Scapy, que permite fácilmente armar un paquete ARP \textit{who-has} de la siguiente forma: \\
\texttt{ARP( hwdst = mac\_broadcast, pdst= dst\_ip)} . \\

En este caso \texttt{pdst} es la dirección IP de la cual queremos saber su MAC asociada. Luego se envía el paquete utilizando \\

\texttt{sr1(arp\_packet, iface= interface, verbose=0, retry=1, timeout=1)} \\

Donde \texttt{sr1} es una función de Scapy que envia paquetes a la red devolviendo sólo una respuesta. Previamente hay que configurar la variable \texttt{interface}, indicando la interface de nuestra PC sobre la cual enviar el mensaje. \\

Todo esto fue implementado en el archivo \texttt{arp\_client.py}. Provee una función que devuelve el resultado del mensaje ARP y otra función para imprimirlo. Se debe correr con permisos de administrador. \\

También implementamos \texttt{test\_arp\_client.py}, en el cual realizamos pruebas simples sobre el cliente ARP. También hay que ejecutarlo como administrador y configurar la IP de la PC actual para una de las pruebas. \\

\subsection{Sniffer con Scapy}
En la segunda consigna se pide poder escuchar la red local por un intervalo de tiempo, capturando todos los paquetes ARP. Para lograr esto, también utilizamos Scapy y el cliente ARP del punto anterior. El programa \texttt{sniffer.py} toma como argumento la cantidad de segundos que se sniffeará la red (por default son 10 segundos). Scapy provee una función \texttt{sniff()} la cual puede tomar un filtro con la sintaxis BPF, en nuestro caso queda: \\

\texttt{sniff(timeout=timeout,filter='arp')} \\

Luego del tiempo establecido, se listan todos los paquetes ARP encontrados y se imprimen formateados. \\


\subsection{Capturando paquetes de la red con Wireshark}
Para analizar y juntar datos sobre diferentes redes utilizamos Wireshark. Elegimos Wireshark en vez de nuestro sniffer casero porque provee más información de la red además de lo que capturamos nosotros y se pueden importar archivos pcap con redes ya analizadas. \\

Capturamos paquetes de redes caseras y una red de oficina durante intervalos de más de dos horas, filtrando los paquetes ARP obtenidos. Dentro de esos conjuntos hay paquetes \texttt{who-has} y \texttt{reply}. \\

Las redes consideradas fueron: \\

\large
\begin{center}
\begin{tabular}{ | l | l | l | }
  \hline
  Red 1 & Menos de 10 nodos & Casera\\ \hline
  Red 2 & Menos de 10 nodos & Casera\\ \hline
  Red 3 & Más de 35 nodos & Oficina\\
  \hline
\end{tabular}
\end{center}
\normalsize 

\subsection{Cálculo de entropía e información}
El modelo que tomamos es el una fuente de información discreta de memoria nula (i.e. que cada evento es probabilísticamente independiente de los otros). Esta decisión obedece a una cuestión práctica, para simplificar el análisis posterior. El conjunto de símbolos que definimos fueron las IPs destino de los request \textit{ARP}.

Para calcular la entropía de las redes se tomó como fuente de información las IPs solicitadas por ARP. Nos quedó pendiente tomar como fuente las IPs solicitantes. En cuanto a las direcciones MAC, consideramos que no era relevante la información aportada por éstas ya que en el caso de las MAC solicitadas iba a predominar la MAC broadcast, mientras que en el caso de las MAC solicitantes la información iba a ser similar al de las IPs solicitantes.

Se realizaron scripts para facilitar la tarea de calcular entropía, probabilidades y formateo de datos para graficar tomando como input un conjunto de paquetes ARP en formato CSV.

Se realizaron gráficos de entropía a través del tiempo, histogramas de IPs ordenados por la cantidad de información de cada IP y grafos de cada red utilizando herramientas como Gnuplot, Graphviz y Excel.

También se realizaron estudios sobre la cantidad de información provista por los paquetes ARP destinados al router versus la entropía generada por IPs solicitadas en una red.
